package persistentie;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import domein.Artikel;
import domein.Klant;
import domein.Rekening;
import domein.Rekeninglijn;

/**
* @author Mattias Gees
*/
public class RekeningMapper {
	
	@SuppressWarnings("deprecation")
	public Rekening addRekening(Rekening rekening) {
		Connection cxn = Database.getInstance().getConnection();
		try{
			String sql = String.format("INSERT INTO Rekening (PersoonID, Datum) VALUES ('%s', '%4d-%02d-%02d')", rekening.getKlant().getId(), rekening.getDatum().getYear()+1900, rekening.getDatum().getMonth()+1, rekening.getDatum().getDate());
			Statement statement = cxn.createStatement();
			statement.executeQuery(sql);
		}
		catch(Exception exception){
		}
		return this.getRekening(rekening.getKlant().getId(), rekening.getDatum());
	}
	
	public List<Rekening> getRekeningen() {
		List<Rekening> rekeningenLijst = new ArrayList<Rekening>();
		Connection cxn = Database.getInstance().getConnection();
		
		try{
			Statement statement = cxn.createStatement();
			ResultSet resultaat = statement.executeQuery("SELECT Rekening.RekeningID, Rekening.PersoonID, Persoon.Naam, Persoon.Voornaam, Rekening.Datum, Resource.ArtikelID FROM (Rekening INNER JOIN Persoon ON Persoon.PersoonID = Rekening.PersoonID) LEFT JOIN Resource ON Rekening.RekeningID = Resource.Status WHERE Rekening.Betaald = 0 ORDER BY Persoon.Naam");
			while (resultaat.next()){
				int rekeningId = resultaat.getInt("RekeningID");
				Klant klant = new Klant(resultaat.getInt("PersoonID"), resultaat.getString("Naam"), resultaat.getString("Voornaam"));
				Date datum = resultaat.getDate("Datum");
				int res = resultaat.getInt("ArtikelID");						
				Rekening rekening = new Rekening(rekeningId, klant, datum, 0.0, res);
				rekeningenLijst.add(rekening);
			}
			statement.close();	
		}
		catch(Exception e){

		}
		return rekeningenLijst;
	}
	
	public Rekening getRekening(int id){
		Rekening rekening = null;
		try {
			Connection cxn = Database.getInstance().getConnection();
			Statement statement = cxn.createStatement();
			String query = "SELECT Rekening.PersoonID, Persoon.Naam, Persoon.Voornaam, Rekening.Datum, Resource.ArtikelID FROM (Rekening INNER JOIN Persoon ON Persoon.PersoonID = Rekening.PersoonID) LEFT JOIN Resource ON Rekening.RekeningID = Resource.Status WHERE RekeningID ="+id;
			ResultSet resultaat = statement.executeQuery(query);
			
			
			if(resultaat.next()){
				Klant klant = new Klant(resultaat.getInt("PersoonID"), resultaat.getString("Naam"), resultaat.getString("Voornaam"));
				Date datum = resultaat.getDate("Datum");
				double saldo = 0.0;
				int resource = resultaat.getInt("ArtikelID");
				statement.close();
				return new Rekening(id, klant, datum, saldo, resource);
			}
			else{
				throw new Exception();
			}
		}
		catch(Exception e){
			return rekening;
		}
	}
	
	public Rekening getRekening(int klantId, Date datum){
		Rekening rekening;
		Connection cxn = Database.getInstance().getConnection();
		try {
			Statement statement = cxn.createStatement();
			String query = "SELECT Rekening.RekeningID, Persoon.Naam, Persoon.Voornaam, Rekening.Datum FROM Rekening INNER JOIN Persoon ON Persoon.PersoonID = Rekening.PersoonID WHERE Rekening.PersoonID="+klantId+" AND Rekening.Datum="+datum;
			ResultSet resultaat = statement.executeQuery(query);
			Klant klant = new Klant(klantId, resultaat.getString("Naam"), resultaat.getString("Voornaam"));
			int rekeningid = resultaat.getInt("RekeningID");
			double saldo = 0.0;
			rekening = new Rekening(rekeningid, klant, datum, saldo);
			statement.close();
		}
		catch(Exception e){
			rekening = null;
		}
		return rekening;
	}
		
	public void addRekeningLijn(Rekening rekening, int artikelId, int aantal) {
		int aantalArtikelen = 0;
		Connection cxn = Database.getInstance().getConnection();
		
		try{
			Statement statement = cxn.createStatement();
			ResultSet resultaat = statement.executeQuery("SELECT COUNT(RekeningLijn.ArtikelID) AS Artikel FROM RekeningLijn WHERE RekeningLijn.ArtikelID = "+artikelId+"AND RekeningLijn.RekeningID ="+rekening.getId());
		
			if(resultaat.next()){
				aantalArtikelen = resultaat.getInt("Artikel");
			}
			statement.close();
			if(aantalArtikelen >= 1){
				// Updaten van aantal +1
				String sql = String.format("UPDATE RekeningLijn SET Aantal = (Aantal + "+aantal+")  WHERE RekeningLijn.ArtikelID = "+artikelId+"AND RekeningLijn.RekeningID ="+rekening.getId());
				Statement statementUpdate = cxn.createStatement();
				statementUpdate.executeQuery(sql);
				statementUpdate.close();
			}else{
				// Toevoegen van nieuwe rekeninglijn met 1 aantal
				String sql = String.format("INSERT INTO RekeningLijn (RekeningID, ArtikelID, Aantal) VALUES (%d,%d,%d)", rekening.getId(), artikelId, aantal);
				Statement statementAdd = cxn.createStatement();
				statementAdd.executeQuery(sql);
				statementAdd.close();
			}
		}catch(Exception e){
			//JOptionPane.showMessageDialog(null,"FOUTJE!");
		}
	}
	
	public void removeRekeningLijn (Rekening rekening, int artikelId) throws Exception{
		int aantalArtikelen = 0;
		Connection cxn = Database.getInstance().getConnection();
		
		try{
			Statement statement = cxn.createStatement();
			ResultSet resultaat = statement.executeQuery("SELECT RekeningLijn.Aantal FROM RekeningLijn WHERE RekeningLijn.ArtikelID = "+artikelId+"AND RekeningLijn.RekeningID ="+rekening.getId());
		
			while (resultaat.next()){
				aantalArtikelen = resultaat.getInt("Aantal");
			}
			statement.close();
			if(aantalArtikelen > 1){
				// Minderen van aantal - 1
				String sql = String.format("UPDATE RekeningLijn SET Aantal = (Aantal - 1)  WHERE RekeningLijn.ArtikelID = "+artikelId+"AND RekeningLijn.RekeningID ="+rekening.getId());
				PreparedStatement statementUpdate = cxn.prepareStatement(sql);
				statementUpdate.executeUpdate();
			}else{
				// Verwijderen van rekeninglijn als er maar 1 in de rekening zit.
				String sql = String.format("DELETE FROM RekeningLijn WHERE RekeningLijn.ArtikelID = "+artikelId+"AND RekeningLijn.RekeningID ="+rekening.getId());
				PreparedStatement statementAdd = cxn.prepareStatement(sql);
				statementAdd.executeUpdate();
			}
			
			updateVoorraadExtra(artikelId);
		}catch(Exception e){
		}
	}
	
	public double getTeBetalenBedrag(Rekening rekening){
		Connection cxn = Database.getInstance().getConnection();
		double teBetalen = 0;
		try{
			Statement statement = cxn.createStatement();
			ResultSet resultaat = statement.executeQuery("SELECT SUM(RekeningLijn.Aantal * Artikel.Prijs) AS TeBetalen FROM RekeningLijn INNER JOIN Artikel ON Artikel.ArtikelID = RekeningLijn.ArtikelID WHERE RekeningLijn.RekeningID ="+ rekening.getId());
		
			while (resultaat.next()){
				teBetalen = resultaat.getDouble("TeBetalen");
			}
			statement.close();
			
			return teBetalen;
			
		}catch(Exception e){
			return 0;
		}
	}
	
	public double inkomsten(int betaald){
		Connection cxn = Database.getInstance().getConnection();
		double opbrengst = 0;
		try{
			Statement statement = cxn.createStatement();
			ResultSet resultaat = statement.executeQuery("SELECT SUM(RekeningLijn.Aantal * Artikel.Prijs) AS opbrengst FROM (RekeningLijn INNER JOIN Artikel ON Artikel.ArtikelID = RekeningLijn.ArtikelID) INNER JOIN Rekening ON Rekening.RekeningID = RekeningLijn.RekeningID WHERE Rekening.Datum = DATE() AND Rekening.Betaald ="+betaald);
		
			while (resultaat.next()){
				opbrengst = resultaat.getDouble("opbrengst");
			}
			statement.close();
			
			return opbrengst;
			
		}catch(Exception e){
			return 0;
		}
	}
	
	public List<Rekeninglijn> getExtraLijnen(Rekening rekening){
		List<Rekeninglijn> consumptieLijst = new ArrayList<Rekeninglijn>();
		Connection cxn = Database.getInstance().getConnection();
		
		try{
			Statement statement = cxn.createStatement();
			ResultSet resultaat = statement.executeQuery("SELECT Artikel.ArtikelID, Artikel.Omschrijving, Artikel.Eenheid, Artikel.Prijs, RekeningLijn.Aantal FROM (Artikel INNER JOIN Extra ON Artikel.ArtikelID = Extra.ArtikelID) INNER JOIN RekeningLijn ON Artikel.ArtikelID = RekeningLijn.ArtikelID WHERE RekeningLijn.RekeningID="+ rekening.getId());
				
			while (resultaat.next()){
				int artikelId = resultaat.getInt("ArtikelID");
				String omschrijving = resultaat.getString("Omschrijving");
				String eenheid = resultaat.getString("Eenheid");
				double prijs = resultaat.getInt("Prijs");
				int aantal  = resultaat.getInt("Aantal");
										
				Artikel extra = new Artikel(artikelId, omschrijving, eenheid, prijs);
				Rekeninglijn rekeninglijn = new Rekeninglijn(extra, aantal);
				consumptieLijst.add(rekeninglijn);
			}
			statement.close();
					
		}
		catch(Exception e){
	
		}
		return consumptieLijst;		
	}
	
	private void updateVoorraadExtra(int artikelId){
		Connection cxn = Database.getInstance().getConnection();
		int aantalArtikelen = 0;
		try{
			Statement statement = cxn.createStatement();
			ResultSet resultaat = statement.executeQuery("SELECT COUNT(Extra.ArtikelID) AS aantal FROM Extra WHERE Extra.ArtikelID = "+ artikelId);
		
			while (resultaat.next()){
				aantalArtikelen = resultaat.getInt("aantal");
			}
			statement.close();
			if(aantalArtikelen >= 1){
				String sql = String.format("UPDATE Extra SET Voorraad = (Voorraad + 1)  WHERE Extra.ArtikelID = "+artikelId);
				PreparedStatement statementUpdate = cxn.prepareStatement(sql);
				statementUpdate.executeUpdate();
			}
		}catch(Exception e){
		}
	}
	
	public void resetResource(Rekening rekening){
		Connection cxn = Database.getInstance().getConnection();
		
		try{
			String sql = String.format("UPDATE Resource SET Status = 0  WHERE Resource.ArtikelID IN (SELECT  RekeningLijn.ArtikelID FROM RekeningLijn INNER JOIN Resource ON RekeningLijn.ArtikelID = Resource.ArtikelID WHERE RekeningLijn.RekeningID ="+rekening.getId()+")");
			PreparedStatement statement = cxn.prepareStatement(sql);
			statement.executeUpdate();
		}
		catch(Exception exception){
		}
	}
	
	public void setRekeningBetaald(Rekening rekening){
		Connection cxn = Database.getInstance().getConnection();
		
		try{
			String sql = String.format("UPDATE Rekening SET Betaald = 1  WHERE Rekening.RekeningID =" + rekening.getId());
			PreparedStatement statement = cxn.prepareStatement(sql);
			statement.executeUpdate();
		}
		catch(Exception exception){
		}
	}
	
	public List<Rekeninglijn> getArtikelen(int rekeningId) throws NullPointerException {
		
		List<Rekeninglijn> artikelLijst = new ArrayList<Rekeninglijn>();
		Connection cxn = Database.getInstance().getConnection();
		
		try{
			Statement statement = cxn.createStatement();
			ResultSet resultaat = statement.executeQuery("SELECT Artikel.ArtikelID, Artikel.Omschrijving, Artikel.Eenheid, Artikel.Prijs, RekeningLijn.Aantal FROM Artikel INNER JOIN RekeningLijn ON RekeningLijn.ArtikelID = Artikel.ArtikelID WHERE RekeningLijn.RekeningID = "+rekeningId);
				
			while (resultaat.next()){
				int artikelId = resultaat.getInt("ArtikelID");
				String omschrijving = resultaat.getString("Omschrijving");
				String eenheid = resultaat.getString("Eenheid");
				double prijs = resultaat.getDouble("Prijs");
				int aantal = resultaat.getInt("Aantal");
										
				Artikel artikel = new Artikel(artikelId, omschrijving, eenheid, prijs);
				Rekeninglijn rekeninglijn = new Rekeninglijn(artikel, aantal);
				artikelLijst.add(rekeninglijn);
			}
			statement.close();
					
		}
		catch(NullPointerException e){
			throw e;
		}
		catch(Exception e){
	
		}
		return artikelLijst;
	}
}